﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;


namespace Sistema_Bancario.Controllers
{
    public class controladorBancoController : Controller
    {
        public enum CuentasEnum
        {
            cuentaCorriente, CajaDeAhorro
        }

        private static List<Banco> bancos = new List<Banco>();

        public ActionResult Index()
        {
            return View();
        }


        public ActionResult altaBanco()
        {
            return View();
        }


        public ActionResult darDeAltaNuevoBanco(String nombreBancoNuevo)
        {
            //  Dar de alto nuevo banco  logicamente
            Banco bancoNuevo = new Banco(nombreBancoNuevo);
            bancos.Add(bancoNuevo);

            return Redirect("Index");
        }


        public ActionResult listarTodosLosBancos()
        {
            return View(bancos);
        }


        public ActionResult listarCuentasDelBanco(Int16 numeroBanco)
        {
            Banco banco = bancos[numeroBanco];
            List<Cuenta> cuentasDelBanco = banco.cuentasDeClientes;
            ViewBag.nombreDelBanco = banco.nombre;
            ViewBag.numeroBanco = numeroBanco;

            return View(cuentasDelBanco);
        }


        public ActionResult cuentasManager(Int16 numeroBanco)
        {
            Banco banco = bancos[numeroBanco];
            ViewBag.numeroBanco = numeroBanco;
            return View(banco);
        }

        public ActionResult crearCuentaNueva(Int16 numeroBanco)
        {
            Banco banco = bancos[numeroBanco];
            ViewBag.numeroBanco = numeroBanco;
            ViewBag.nombreBanco = banco.nombre;

            string[] cuentas = Enum.GetNames(typeof(CuentasEnum));
            ViewBag.tiposDeCuentas = cuentas;

            List<Cliente> clientes = banco.obtenerListaDeClientes();
            return View(clientes);
        }

        public ActionResult clientesmanager(Int16 numeroBanco)
        {
            Banco banco = bancos[numeroBanco];
            ViewBag.numeroBanco = numeroBanco;
            return View(banco);
        }

        public ActionResult crearNuevocliente(Int16 numeroBanco)
        {
            Banco banco = bancos[numeroBanco];
            ViewBag.numeroBanco = numeroBanco;
            return View(banco);
            
        }


        public ActionResult crearCuentaNuevaConClienteNuevo(Int16 numeroBanco)
        {
            Banco banco = bancos[numeroBanco];
            ViewBag.numeroBanco = numeroBanco;
            ViewBag.nombreBanco = banco.nombre;
            string[] cuentas = Enum.GetNames(typeof(CuentasEnum));
            ViewBag.tiposDeCuentas = cuentas;
            return View(banco);
        }


        private Cuenta crearCuentaDependiendoDelTipoDeCuenta(CuentasEnum tipoDeCuenta, String numeroDeCuenta, Cliente clienteNuevo)
        {
            Cuenta cuentaADevolver = null;

            if (tipoDeCuenta == CuentasEnum.CajaDeAhorro)
            {
                CajaDeAhorro cajaDeAhorroNueva = new CajaDeAhorro(numeroDeCuenta, clienteNuevo);
                cuentaADevolver = cajaDeAhorroNueva;
            }
            else if (tipoDeCuenta == CuentasEnum.cuentaCorriente)
            {
                CuentaCorriente cuentaCorrienteNueva = new CuentaCorriente(numeroDeCuenta, clienteNuevo);
                cuentaADevolver = cuentaCorrienteNueva;
            }

            return cuentaADevolver;
            
        }


        public ActionResult guardarCuentaConClienteExistente(Int16 numeroBanco, String numeroDeCuenta, String dniCliente, CuentasEnum tipoCuenta)
        {
            //  Obtengo el banco involucrado
            Banco banco = bancos[numeroBanco];

            //  Obtengo el cliente existente
            Cliente clienteExistente = banco.obtenerClienteconDni(dniCliente);

            Cuenta cuentaNueva = crearCuentaDependiendoDelTipoDeCuenta(tipoCuenta, numeroDeCuenta, clienteExistente);

            // agrego la cuenta al banco
            banco.agregarCuenta(cuentaNueva);

            return Redirect("listarTodosLosBancos");

        }

        public ActionResult guardarCuentaConClienteNuevo(Int16 numeroBanco, String numeroDeCuenta, String dniCliente, String nombreCliente, CuentasEnum tipoCuenta)
        {
            //  Creo cliente nuevo
            Cliente clienteNuevo = new Cliente(nombreCliente, dniCliente);

            //  Obtengo el banco
            Banco banco = bancos[numeroBanco];

            //  Creo cuenta dependiendo del tipo de cuenta
            Cuenta cuentaNueva = crearCuentaDependiendoDelTipoDeCuenta(tipoCuenta, numeroDeCuenta, clienteNuevo);

            banco.agregarCuenta(cuentaNueva);

            return Redirect("listarTodosLosBancos");

        }

        public ActionResult depositarDinero(String numeroDeCuenta, Int16 numeroBanco)
        {
            
            //  Obtengo el banco
            Banco banco = bancos[numeroBanco];

            // obtengo la cuenta
            List<Cuenta> cuentas = banco.cuentasDeClientes;

            Cuenta cuentaBuscada = null;

            foreach (Cuenta cuenta in cuentas)
            {
                if (cuenta.numDeCuenta == numeroDeCuenta)
                {
                    cuentaBuscada = cuenta;
                }
            }
            ViewBag.numeroBanco = numeroBanco;
            ViewBag.nombreBanco = banco.nombre;
            return View(cuentaBuscada);
        }

        public ActionResult hacerDEposito(String numeroDeCuenta, Int16 numeroBanco, uint saldoADepositar)
        {
            //  Obtengo el banco
            Banco banco = bancos[numeroBanco];

            // obtengo la cuenta
            List<Cuenta> cuentas = banco.cuentasDeClientes;

            Cuenta cuentaBuscada = null;

            foreach (Cuenta cuenta in cuentas)
            {
                if (cuenta.numDeCuenta == numeroDeCuenta)
                {
                    cuentaBuscada = cuenta;
                }
            }

            cuentaBuscada.depositarDinero(saldoADepositar);

            return Redirect("listarTodosLosBancos");
        }


        public ActionResult extraerDinero(String numeroDeCuenta, Int16 numeroBanco)
        {
            //  Obtengo el banco
            Banco banco = bancos[numeroBanco];

            // obtengo la cuenta
            List<Cuenta> cuentas = banco.cuentasDeClientes;

            Cuenta cuentaBuscada = null;

            foreach (Cuenta cuenta in cuentas)
            {
                if (cuenta.numDeCuenta == numeroDeCuenta)
                {
                    cuentaBuscada = cuenta;
                }
            }
            ViewBag.numeroBanco = numeroBanco;
            ViewBag.nombreBanco = banco.nombre;
            return View(cuentaBuscada);
        }

        public ActionResult hacerExtraccion(String numeroDeCuenta, Int16 numeroBanco, uint saldoAExtraer)
        {
            //  Obtengo el banco
            Banco banco = bancos[numeroBanco];

            // obtengo la cuenta
            List<Cuenta> cuentas = banco.cuentasDeClientes;

            Cuenta cuentaBuscada = null;

            foreach (Cuenta cuenta in cuentas)
            {
                if (cuenta.numDeCuenta == numeroDeCuenta)
                {
                    cuentaBuscada = cuenta;
                }
            }

            cuentaBuscada.extraerDinero((float)saldoAExtraer);

            return Redirect("listarTodosLosBancos");
        }

        public ActionResult listarClientesDelBanco(Int16 numeroBanco)
        {
            //  Obtengo el banco
            Banco banco = bancos[numeroBanco];

            // obtengo los clientes

            // ERROR: se repiten los clientes porque dos cuentas diferenetes 
            // pueden tener el mismo cliente
            List<Cliente> clientes = banco.obtenerListaDeClientes();

            ViewBag.numeroBanco = numeroBanco;
            ViewBag.nombreBanco = banco.nombre;

            return View(clientes);
        }

    }
}
